<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>CREATE OPERATOR</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="REFENTRY">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="sql-createlanguage.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="sql-createlanguage.html">快退</a></td><td width="60%" align="center" valign="bottom"></td><td width="10%" align="right" valign="top"><a href="sql-createopclass.html">快进</a></td><td width="10%" align="right" valign="top"><a href="sql-createopclass.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<h1><a name="SQL-CREATEOPERATOR"></a>CREATE OPERATOR</h1>
<div class="REFNAMEDIV"><a name="AEN47744"></a><h2>名称</h2>CREATE OPERATOR&nbsp;--&nbsp;定义一个新操作符</div>
<a name="AEN47747"></a>
<div class="REFSYNOPSISDIV"><a name="AEN47749"></a><h2>语法</h2>
<pre class="SYNOPSIS">CREATE OPERATOR <tt class="REPLACEABLE"><i>name</i></tt> (
    PROCEDURE = <tt class="REPLACEABLE"><i>funcname</i></tt>
    [, LEFTARG = <tt class="REPLACEABLE"><i>lefttype</i></tt> ] [, RIGHTARG = <tt class="REPLACEABLE"><i>righttype</i></tt> ]
    [, COMMUTATOR = <tt class="REPLACEABLE"><i>com_op</i></tt> ] [, NEGATOR = <tt class="REPLACEABLE"><i>neg_op</i></tt> ]
    [, RESTRICT = <tt class="REPLACEABLE"><i>res_proc</i></tt> ] [, JOIN = <tt class="REPLACEABLE"><i>join_proc</i></tt> ]
    [, HASHES ] [, MERGES ]
    [, SORT1 = <tt class="REPLACEABLE"><i>left_sort_op</i></tt> ] [, SORT2 = <tt class="REPLACEABLE"><i>right_sort_op</i></tt> ]
    [, LTCMP = <tt class="REPLACEABLE"><i>less_than_op</i></tt> ] [, GTCMP = <tt class="REPLACEABLE"><i>greater_than_op</i></tt> ]
)</pre>
</div>
<div class="REFSECT1"><a name="AEN47763"></a><h2>描述</h2>
<p><tt class="COMMAND">CREATE OPERATOR</tt> 定义一个新的 <tt class="REPLACEABLE"><i>name</i></tt> 操作符。定义该操作符的用户将成为其所有者。如果给出了一个模式名，那么该操作符将在指定的模式中创建。否则它会在当前模式中创建。</p>
<p>操作符 name 是一个最多 <tt class="SYMBOL">NAMEDATALEN</tt>-1 长的(缺省为 63 个)下列字符组成的字符串：
<p class="LITERALLAYOUT">+&nbsp;-&nbsp;*&nbsp;/&nbsp;&lt;&nbsp;&gt;&nbsp;=&nbsp;~&nbsp;!&nbsp;@&nbsp;#&nbsp;%&nbsp;^&nbsp;&amp;&nbsp;|&nbsp;`&nbsp;?</p>
你选择名字的时候有几个限制：</P>
<ul>
<li><p><tt class="LITERAL">--</tt> 和 <tt class="LITERAL">/*</tt> 不能在操作符的任何地方出现，因为它们会被认为是一个注释的开始。</p></li>
<li><p>一个多字符的操作符不能以 <tt class="LITERAL">+</tt> 或 <tt class="LITERAL">-</tt> 结尾，除非该名字还包含至少下面字符之一：
<p class="LITERALLAYOUT">~&nbsp;!&nbsp;@&nbsp;#&nbsp;%&nbsp;^&nbsp;&amp;&nbsp;|&nbsp;`&nbsp;?</p>
例如， <tt class="LITERAL">@-</tt> 是一个允许的操作符名，但 <tt class="LITERAL">*-</tt> 不是。这个限制允许 PostgreSQL 分析 SQL 兼容的查询而不要求在符号之间有空白。</p></li>
</ul>
<p>操作符 <tt class="LITERAL">!=</tt> 在输入时映射成 <tt class="LITERAL">&lt;&gt;</tt> ，因此这两个名称总是等价的。</p>
<p>至少需要定义一个 <tt class="LITERAL">LEFTARG</tt> 和 <tt class="LITERAL">RIGHTARG</tt> 。对于双目操作符来说，两者都需要定义。对右目操作符来说，只需要定义 <tt class="LITERAL">LEFTARG</tt> ，而对于左目操作符来说，只需要定义 <tt class="LITERAL">RIGHTARG</tt> 。</p>
<p>同样，<tt class="REPLACEABLE"><i>funcname</i></tt> 过程必须已经用 <tt class="COMMAND">CREATE FUNCTION</tt> 定义过，而且必须定义为接受正确数量的指定类型参数(一个或是两个)。</p>
<p>其它子句声明可选的操作符优化子句。他们的含义在<a href="xoper-optimization.html">节33.13</a>里定义。</p>
</div>
<div class="REFSECT1"><a name="AEN47797"></a><h2>参数</h2>
<div class="VARIABLELIST">
<dl>
<dt><tt class="REPLACEABLE"><i>name</i></tt></dt>
<dd><p>要定义的操作符。可用的字符见上文。其名字可以用模式修饰(比如 <tt class="LITERAL">CREATE OPERATOR myschema.+ (...)</tt>)。如果没有模式，则在当前模式中创建操作符。同一个模式中的两个操作符可以有一样的名字，只要他们操作不同的数据类型。这叫做<i class="FIRSTTERM">重载</i>。</p></dd>
<dt><tt class="REPLACEABLE"><i>funcname</i></tt></dt>
<dd><p>用于实现该操作符的函数</p></dd>
<dt><tt class="REPLACEABLE"><i>lefttype</i></tt></dt>
<dd><p>操作符左边的参数数据类型，如果存在的话。如果是左目操作符，这个参数可以省略。</p></dd>
<dt><tt class="REPLACEABLE"><i>righttype</i></tt></dt>
<dd><p>操作符右边的参数数据类型，如果存在的话。如果是右目操作符，这个参数可以省略。</p></dd>
<dt><tt class="REPLACEABLE"><i>com_op</i></tt></dt>
<dd><p>该操作符对应的交换操作符</p></dd>
<dt><tt class="REPLACEABLE"><i>neg_op</i></tt></dt>
<dd><p>该操作符对应的负操作符</p></dd>
<dt><tt class="REPLACEABLE"><i>res_proc</i></tt></dt>
<dd><p>此操作符约束选择性评估函数</p></dd>
<dt><tt class="REPLACEABLE"><i>join_proc</i></tt></dt>
<dd><p>此操作符连接选择性评估函数</p></dd>
<dt><tt class="LITERAL">HASHES</tt></dt>
<dd><p>表明此操作符支持 Hash 连接</p></dd>
<dt><tt class="LITERAL">MERGES</tt></dt>
<dd><p>表明此操作符可以支持一个融合连接</p></dd>
<dt><tt class="REPLACEABLE"><i>left_sort_op</i></tt></dt>
<dd><p>此操作符的左边数据的排序操作符(如果此操作符支持融合连接)</p></dd>
<dt><tt class="REPLACEABLE"><i>right_sort_op</i></tt></dt>
<dd><p>此操作符的右边数据的排序操作符(如果此操作符支持融合连接)</p></dd>
<dt><tt class="REPLACEABLE"><i>less_than_op</i></tt></dt>
<dd><p>比较这个操作符的输入数据类型的小于操作符(如果此操作符支持融合连接)</p></dd>
<dt><tt class="REPLACEABLE"><i>greater_than_op</i></tt></dt>
<dd><p>比较这个操作符的输入数据类型的大于操作符(如果此操作符支持融合连接)</p></dd>
</dl>
</div>
<p>使用 <tt class="LITERAL">OPERATOR()</tt> 语法在 <tt class="REPLACEABLE"><i>com_op</i></tt> 或者其它可选参数里给出一个模式修饰的操作符名，比如：</p>
<pre class="PROGRAMLISTING">COMMUTATOR = OPERATOR(myschema.===) ,</pre>
</div>
<div class="REFSECT1"><a name="AEN47876"></a><h2>注意</h2>
<p>参阅<a href="xoper.html">节33.12</a>中的操作符章节获取更多信息。</p>
<p>使用 <a href="sql-dropoperator.html"><i>DROP OPERATOR</i></a> 从数据库中删除用户定义操作符。使用 <a href="sql-alteroperator.html"><i>ALTER OPERATOR</i></a> 修改一个数据库里的操作符。</p>
</div>
<div class="REFSECT1"><a name="AEN47883"></a><h2>例子</h2>
<p>下面命令定义一个新操作符：面积相等，用于 <tt class="TYPE">box</tt> 数据类型。</p>
<pre class="PROGRAMLISTING">CREATE OPERATOR === (
    LEFTARG = box,
    RIGHTARG = box,
    PROCEDURE = area_equal_procedure,
    COMMUTATOR = ===,
    NEGATOR = !==,
    RESTRICT = area_restriction_procedure,
    JOIN = area_join_procedure,
    HASHES,
    SORT1 = &lt;&lt;&lt;,
    SORT2 = &lt;&lt;&lt;
    -- 因为给出了排序操作符，所以索引隐含地有 MERGES 。
    -- LTCMP 和 GTCMP 分别假设是 &lt; 和 &gt;
);</pre>
</div>
<div class="REFSECT1"><a name="AEN47888"></a><h2>兼容性</h2>
<p><tt class="COMMAND">CREATE OPERATOR</tt> 是 PostgreSQL 扩展。SQL 标准中没有该语句。</p>
</div>
<div class="REFSECT1"><a name="AEN47893"></a><h2>又见</h2><a href="sql-alteroperator.html"><i>ALTER OPERATOR</i></a>, <a href="sql-createopclass.html"><i>CREATE OPERATOR CLASS</i></a>, <a href="sql-dropoperator.html"><i>DROP OPERATOR</i></a></div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="sql-createlanguage.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="sql-createopclass.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">CREATE LANGUAGE</td><td width="34%" align="center" valign="top"><a href="sql-commands.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">CREATE OPERATOR CLASS</td></tr>
</table>
</div>
</body></html>